package org.ma1.cripto.aes.gui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class VentanaPpal extends JFrame implements ActionListener {
	
	public static final String TITULO_VENTANA = "Algoritmo AES";
	
	private AlgoritmoVis algoritmoVis = null;
	private DescripcionPanel descripcionPanel = null;
	
	private JButton empezar = null;
	private JButton siguiente = null;
	
	private TextoPanel textoAclarado = null;
	private TextoPanel textoCifrado = null;
	
	private Controlador controlador;
	
	public VentanaPpal() {
		super(TITULO_VENTANA);

		controlador = new Controlador();
		
		// configuracion de la ventana
		configurar();
		
		this.setVisible(true);
		this.setSize(1200,800);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// inicializacion de los elementos
		inicializarBarraHerramientas();
	}
	
	private void configurar() {
		JPanel c = new JPanel(); 
		c.setLayout(new BorderLayout());
		c.setBorder(new TitledBorder("Traza algoritmo"));
		c.add(algoritmoVis = new AlgoritmoVis(), BorderLayout.CENTER);
		this.setContentPane(new JPanel());
		((JPanel)this.getContentPane()).setLayout(new BorderLayout());
		((JPanel)this.getContentPane()).setBorder(BorderFactory.createEmptyBorder(10,15,10,10));
		this.getContentPane().add(descripcionPanel = new DescripcionPanel(),BorderLayout.SOUTH);
		this.getContentPane().add(c,BorderLayout.CENTER);
		JPanel d = new JPanel();
		d.setPreferredSize(new Dimension(650,700));
		d.setLayout(new BoxLayout(d,BoxLayout.PAGE_AXIS));
		textoAclarado = new TextoPanel();
		textoAclarado.setNombre("Texto aclarado");
		textoAclarado.addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {
				SoporteDispararCambio.getInstanceSoporteTextoAclarado().dispararCambio(IListener.TIPO_ACTUALIZAR_TEXTO, textoAclarado.getText());				
			}
			public void insertUpdate(DocumentEvent e) {
				SoporteDispararCambio.getInstanceSoporteTextoAclarado().dispararCambio(IListener.TIPO_ACTUALIZAR_TEXTO, textoAclarado.getText());				
			}
			public void removeUpdate(DocumentEvent e) {
				SoporteDispararCambio.getInstanceSoporteTextoAclarado().dispararCambio(IListener.TIPO_ACTUALIZAR_TEXTO, textoAclarado.getText());	
			}
		});
		controlador.getSoporteTextoAclarado().addListener(textoAclarado);
		d.add(textoAclarado);
		textoCifrado = new TextoPanel();
		textoCifrado.setNombre("Texto codificado");
		textoCifrado.addDocumentListener(new DocumentListener() {
			public void changedUpdate(DocumentEvent e) {
				SoporteDispararCambio.getInstanceSoporteTextoCifrado().dispararCambio(IListener.TIPO_ACTUALIZAR_TEXTO, textoCifrado.getText());
			}
			public void insertUpdate(DocumentEvent e) {
				SoporteDispararCambio.getInstanceSoporteTextoCifrado().dispararCambio(IListener.TIPO_ACTUALIZAR_TEXTO, textoCifrado.getText());				
			}
			public void removeUpdate(DocumentEvent e) {
				SoporteDispararCambio.getInstanceSoporteTextoCifrado().dispararCambio(IListener.TIPO_ACTUALIZAR_TEXTO, textoCifrado.getText());
			}
		});
		controlador.getSoporteTextoCodificado().addListener(textoCifrado);
		d.add(textoCifrado);
		this.getContentPane().add(d,BorderLayout.EAST);
	}
	
	private void inicializarBarraHerramientas() {
		JToolBar barraHerramientas = new JToolBar();
		barraHerramientas.add(crearBoton("Abrir","abrir","abrir.png"));
		barraHerramientas.add(crearBoton("Guardar","guardar","guardar.png"));
		barraHerramientas.addSeparator(new Dimension(20,0));
		barraHerramientas.add(crearBoton("Colores","colores","colores.png"));
		barraHerramientas.add(crearBoton("Configurar","configurar","configurar.png"));
		barraHerramientas.addSeparator(new Dimension(20,0));
		barraHerramientas.add(crearBoton("Reiniciar","reiniciar","recargar.png"));
		barraHerramientas.add(empezar = crearBoton("Correr","empezar","empezar.png"));
		barraHerramientas.add(crearBoton("Un paso","siguiente","siguiente.png"));
		barraHerramientas.add(crearBoton("Descifrar","descifrar","descifrar.png"));
		barraHerramientas.addSeparator(new Dimension(20,0));
		barraHerramientas.add(crearBoton("Criptoanalisis","criptoanalisis","criptoanalisis.png"));
		barraHerramientas.addSeparator(new Dimension(20,0));
		barraHerramientas.add(crearBoton("Acerca de","acercade","acercade.png"));
		barraHerramientas.add(crearBoton("Salir","salir","salir.png"));
		barraHerramientas.add(crearBoton("Ayuda","ayuda","ayuda.png"));

		this.getContentPane().add(barraHerramientas,BorderLayout.PAGE_START);
	}

	private JButton crearBoton(String nombre, String accion, String icono) {
		JButton boton = new JButton();
		boton.setVerticalTextPosition(AbstractButton.BOTTOM);
		boton.setHorizontalTextPosition(AbstractButton.CENTER);
		boton.setText(nombre);
		boton.setActionCommand(accion);
		ImageIcon icon = new ImageIcon(VentanaPpal.class.getResource("res/"+icono));
		boton.setIcon(icon);
		boton.addActionListener(this);
		return boton;
	}
	
	public static void main(String []args) {
		new VentanaPpal();
	}

	public void actionPerformed(ActionEvent ae) {
		String cmd = ae.getActionCommand();
		controlador.handle(cmd);
	}
	
}
